package com.mdjukebox.model.jukeboxfacade.actions;

import java.sql.Connection;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.mdjukebox.model.dao.CancionDAO;
import com.mdjukebox.model.dao.PeticionDAO;
import com.mdjukebox.model.jukeboxfacade.dao.DJDAO;
import com.mdjukebox.model.vo.CancionVO;
import com.mdjukebox.model.vo.PeticionVO;
import com.mdjukebox.util.GlobalNames;
import com.util.configuration.ConfigurationParametersManager;
import com.util.configuration.MissingConfigurationParameterException;
import com.util.exceptions.InternalErrorException;
import com.util.exceptions.ModelException;
import com.util.sql.TransactionalPlainAction;

public class AltaPeticionAction implements TransactionalPlainAction {
	private static String PARAM_MEDIA_DURACION_CANCION = "MediaDuracionCanciones";
	
	private static Log log = LogFactory.getLog(AltaPeticionAction.class);
	
	private PeticionVO peticion;
	private Timestamp ahora;

	public AltaPeticionAction(PeticionVO vo) {
		this.peticion = vo;		
	}
	
	public AltaPeticionAction(int idCancion, String dedicatoria) {
		ahora = new Timestamp((new Date(System.currentTimeMillis())).getTime());
		
		//si dedicatoria > 255 truncamos
		if (dedicatoria.length()>255){
			dedicatoria = dedicatoria.substring(0, 252) + "...";
		}
		peticion = new PeticionVO(0, idCancion, ahora, null,dedicatoria);
	}

	public Object execute(Connection connection) throws ModelException, InternalErrorException {
		HashMap rdo = new HashMap();

		try{
			DJDAO djdao = new DJDAO();
			PeticionDAO pdao = new PeticionDAO();
			CancionDAO cdao = new CancionDAO();
			
			// Insertar en tabla peticion
			pdao.create(connection, peticion);
			rdo.put("newPeticion", peticion);
			
			// Si cancion no tiene fchPrmPet entonces actualizarla al momento actual
			CancionVO cancion = cdao.getCancionById(connection, peticion.getIdCancion());
			if (log.isDebugEnabled()) log.debug("--- fech peticion cancion "+cancion.getFchPrmPet()+ "-" + peticion.getDedicatoria());

			if (cancion.getFchPrmPet() == null){
				if (log.isDebugEnabled()) log.debug("---- actualizar fecha " + peticion.getFchPeticion()+ "-" + peticion.getDedicatoria());
				cancion.setFchPrmPet(peticion.getFchPeticion());
				cdao.updateCancion(connection, cancion);
			}else{
				if (log.isDebugEnabled()) log.debug("---- no actualizar fecha"+ "-" + peticion.getDedicatoria());

			}
			
			// Calcular cuanto le falta
			int falta = 0;
			if (cancion.getFchUltRep() != null){
				if (log.isDebugEnabled()) log.debug("--- cancion se ha reproducido antes "+cancion.getFchUltRep()+ "-" + peticion.getDedicatoria());

				//si se ha reproducido
				int mediaDuracionCanciones = 0;
				try{
					mediaDuracionCanciones = Integer.parseInt(ConfigurationParametersManager.getParameter(PARAM_MEDIA_DURACION_CANCION));				
				}catch(MissingConfigurationParameterException e){
					if (log.isWarnEnabled()) log.warn("No se ha encontrado el parametro " + PARAM_MEDIA_DURACION_CANCION);
				}
				
//				si se ha reproducido
				int minEntreCanciones = 60;
				try{
					minEntreCanciones = Integer.parseInt(ConfigurationParametersManager.getParameter(GlobalNames.PARAM_MIN_ENTRE_CANCIONES));				
				}catch(MissingConfigurationParameterException e){
					if (log.isWarnEnabled()) log.warn("No se ha encontrado el parametro " + GlobalNames.PARAM_MIN_ENTRE_CANCIONES);
				}
				
				Calendar diff = new GregorianCalendar();
				diff.setTimeInMillis(ahora.getTime() - cancion.getFchUltRep().getTime());
				int minDiff = diff.get(Calendar.MINUTE);
				falta = (minEntreCanciones - minDiff)/mediaDuracionCanciones;

				if (log.isDebugEnabled()) log.debug("---- falta = (" +minEntreCanciones +"- " + minDiff + ")/" + mediaDuracionCanciones + " =" + falta+ "-" + peticion.getDedicatoria());

			}else{
				//si no se ha reproducido entonces contar cuantas tiene por arriba 
				if (log.isDebugEnabled()) log.debug("--- cancion NO se ha reproducido "+ "-" + peticion.getDedicatoria());
				falta = djdao.getNumAnteriores(connection, peticion.getIdCancion());	
				if (log.isDebugEnabled()) log.debug("---- falta ="+ falta + "-" + peticion.getDedicatoria());
			}	
			
			rdo.put("falta", new Integer(falta));
						
		}catch (Exception e){
			throw new InternalErrorException(e);
		}
		if (log.isDebugEnabled()) log.debug("---- devolviendo rdo "+ peticion.getDedicatoria());
		return rdo;
	}
	

	    

}
